#ifndef __CAPAFISICA_ADMINISTRADORDEARCHIVOS_H
#define __CAPAFISICA_ADMINISTRADORDEARCHIVOS_H

/*****************************************************************************
*                     Organizacion de Datos - 75.06                          *
*                         Catedra Lic. Servetto                              *
*            Facultad de Ingenieria - Universidad de Buenos Aires            *
******************************************************************************/

#include "../Comun/Archivo.h"
#include "ArchivoEnDisco.h"
#include "Contenedor.h"
#include "Serializador.h"
#include <string>
#include <map>

using namespace std;
using namespace Comun;

namespace CapaFisica
{
		
	/// Clase que implementa el patron Singleton utilizada para mantener en memoria la metadata de los archivos manetidos por la CapaFisica.
	class AdministradorDeArchivos
	{
		
		private:
		
		static AdministradorDeArchivos* instancia;
		
		map<string, ArchivoEnDisco>* archivos;
		
		bool ExisteRepositorioDeArchivos();
		void AgregarArchivoAlRepositorio(MetadatosArchivo& metadatosArchivo, bool corroborarTamanios);
		void CrearRepositorioDeArchivos();
		void CargarRepositorioDeArchivosEnMemoria();
		ArchivoEnDisco& RecuperarClase(string clase);
		
		protected:
		
		// El contructor y detructuctor es protegido por que la vida de las instancias es mantenida por el propio objeto.
		AdministradorDeArchivos();
		~AdministradorDeArchivos();
		
		public:
		
		/// Metodo estatico que crea si es que no existe por primera vez una instancia del AdministradorDeArchivos o utiliza la que ya tiene en memoria. En el momento de la primera instanciacion las definicion de clases es leida de un archivo en disco.
		/// @return Devuelve la instacia del AdministradorDeArchivos
		static AdministradorDeArchivos& Instancia();
		
		/// Re
		bool ExisteClase(string clase);
		void CrearClaseParaRF(MetadatosArchivo& metadatosDelArchivo);
		void CrearClaseParaRLV(MetadatosArchivo& metadatosDelArchivo);
		int CrearGrupo(string clase, Comun::Grupo& grupo);
		int GuardarGrupo(bool omitirSubflujo, string clase, Comun::Grupo& grupo);
		Comun::Grupo& LeerGrupo(string clase, int grupoId);
		void BorrarGrupo(string clase, int grupoId);
		int PrimerGrupo(string clase);
		int SiguienteGrupo(string clase, int grupoIdActual);
		
		
	};

}

#endif
